extends Control

var tcp_server :TCPServer
var link_s :Array        #——————————————>>>>>>存放玩家链接的数组
var ser_link :StreamPeerTCP #————————————>>>>>存放游戏服务器的链接
var player_data :Resource = load("res://palyer.tres")

func _ready():
	tcp_server = TCPServer.new()


func _on_create_pressed():
	if tcp_server.is_listening():
		return
	else :
		var error = tcp_server.listen(9527,"*")
		if error != OK:
			$sever.append_text("[color=red]创建服务器失败:%s[/color]\n" %str(error))
		else :
			var tim = Time.get_datetime_string_from_system()
			$sever.append_text("[color=green]服务器于系统时间：%s开启[/color]\n" %tim)
			$close.disabled = false


func _process(_delta):
	if tcp_server.is_listening():
		var link = tcp_server.take_connection()
		if link:
			link_s.append(link)
			link.put_var("服务器连接成功")
		for i in link_s:
			if i.get_status() == 2:
				if i.get_available_bytes() > 2:
					var recive_mess = i.get_var()
					$sever.append_text(recive_mess + " [from IP]: " + i.get_connected_host() + "\n")
					_mother_fucker_machine(recive_mess , link_s.find(i))  #调用数据处理函数
			else :
				link_s.erase(i) #删除掉连接不通的链接

func _mother_fucker_machine(recive_mess :String, id :int):
	if recive_mess == "" || recive_mess == "有客户端连接...":  #将空字符和第一次连接字符直接过掉
		return
	else :
		var code = recive_mess.get_slice(",",0) #命令  （如果你的人物需要很多信息，
		var acc = recive_mess.get_slice(",",1)  #账号   数组或者字典是个不错的选择
		var pss = recive_mess.get_slice(",",2)  #密码   我这里用的字符串，我认为够
		var nam = recive_mess.get_slice(",",3)  #名字   用的了，因为这只是登录而已
		var toy = recive_mess.get_slice(",",4)  #模型   真到了游戏，可以用游戏服务器）
		match code:
			"g":
				ser_link = link_s[id] #——————>>>>存储《游戏服务器》的TCP链接
			"r":  #--->>>>>收到注册消息---------
				if ResourceLoader.exists("res://save/" + acc + ".tres"): #判断空账号
					link_s[id].put_var("p")                 #----->>>>>给客户端空账号指令
				else :
					player_data.account = acc
					player_data.password = pss
					ResourceSaver.save(player_data,"res://save/" + acc + ".tres")
					link_s[id].put_var("v," + acc + "," + pss)
			"a":     #--->>>>>收到登录消息---------————————————————————————————————————————————
				if ResourceLoader.exists("res://save/" + acc + ".tres"):
					var player = ResourceLoader.load("res://save/" + acc + ".tres") #加载以账号为名字的存档
					if player.password == pss:      #密码验证成功----------------------------------------
						if player.toy.has(1):
							var nam_1 = player.toy[1][0]   #读取第一个人物
							var toy_1 = player.toy[1][1]
							link_s[id].put_var("s,1,%s,%s" %[nam_1,toy_1]) #发送第一个人物给客户端显示
						if player.toy.has(2):
							var nam_2 = player.toy[2][0]   #读取第二个人物
							var toy_2 = player.toy[2][1]
							link_s[id].put_var("s,2,%s,%s" %[nam_2,toy_2])
						if player.toy.is_empty():
							link_s[id].put_var("s,0")  #没有就发送空置人物的信息（表示人物删除干净了）
					else :
						link_s[id].put_var("x")   #回给客户端密码错误指令
				else :
					link_s[id].put_var("n")  #回给客户端空账号指令（没有注册就点登录按钮的情况）
			"c":   #--->>>>>收到创建人物消息---------————————————————————————————————————————————
				var player = ResourceLoader.load("res://save/" + acc + ".tres") #加载存档
				if pss == "1":    #————>>>>如果指示的是第一个空
					player.toy[1] = [nam , toy , "1" , Vector2(0 , 0) , acc]
					link_s[id].put_var("s,1,%s,%s" %[nam,toy]) #创建成功后得刷新一下角色栏，显示新角色
				elif pss == "2":   #————>>>>如果指示的是第二个空
					player.toy[2] = [nam , toy , "1" , Vector2(0 , 0) , acc]
					link_s[id].put_var("s,2,%s,%s" %[nam,toy])
				elif pss == "0":   #————>>>>如果俩空都满了
					link_s[id].put_var("f") #角色栏满指令
				ResourceSaver.save(player)
			"x":   #--->>>>>收到删除人物消息---------——————————————————————————————————————————
				var player = ResourceLoader.load("res://save/" + acc + ".tres") #加载存档
				player.toy.erase(pss.to_int())
				ResourceSaver.save(player)
				link_s[id].put_var("s,%s,," %pss) #————————>>>>>>>删除完人物存档，然后发给客户端重新显示
			"z":  #--->>>>>收到选择人物消息---------——————————————————————————————————————————
				var player = ResourceLoader.load("res://save/" + acc + ".tres") #加载存档
				if player.toy.has(pss.to_int()):
					link_s[id].put_var(player.toy[pss.to_int()]) #————————>>>>>>>给客户端发送选择的人物数组，准备进入游戏
				
				


func _on_close_pressed():
	if tcp_server.is_listening():
		if ser_link:
			ser_link.put_var("x")
		tcp_server.stop()
		link_s.clear()
		var tim = Time.get_datetime_string_from_system()
		$sever.append_text("[color=red]服务器于系统时间：%s停止[/color]\n" %tim)
	else : return
		

		
